package swimv2gm.bl.session;

import java.util.List;
import java.util.Map;

import javax.ejb.Remote;

import swimv2gm.bl.domain.Account;
import swimv2gm.bl.domain.Admin;
import swimv2gm.bl.domain.User;
import swimv2gm.bl.util.UserData;

/**
 * Il gestore degli utenti: effettua le operazioni di login, ottenimento dati,
 * ricerca...
 * 
 * @author Matteo Gallesio
 */
@Remote
public interface UserManager {
	/**
	 * Inserisce un nuovo utente con i dati indicati.
	 * 
	 * @param email
	 *            email
	 * @param nome
	 *            nome
	 * @param cognome
	 *            cognome
	 * @param password
	 *            password
	 * @return l'id del nuovo utente se l'operazione ha avuto successo,
	 *         <code>-1</code> altrimenti
	 * @throws ExistingDataException
	 */
	public long createUser(String email,String nome,String cognome,String password) throws ExistingDataException;

	/**
	 * Modifica il profilo dell'utente con i dati indicati. Solo id utente,
	 * nome, cognome, email e password sono sempre obbligatori. Se il valore
	 * passato per un parametro è uguale a quello già presente tale parametro
	 * non subisce modifiche.
	 * 
	 * FIXME: valori nulli preesistenti?
	 * 
	 * @param uid
	 *            l'id del profilo da modificare
	 * @param email
	 *            la nuova email
	 * @param nome
	 *            il nuovo nome
	 * @param cognome
	 *            il nuovo cognome
	 * @param telefono
	 *            il nuovo telefono (campo non obbligatorio)
	 * @param indirizzo
	 *            il nuovo indirizzo (campo non obbligatorio)
	 * @param bio
	 *            le nuove informazioni personali (campo non obbligatorio)
	 * @param password
	 *            la password attuale
	 * @param newpassword
	 *            la nuova password (campo non obbligatorio)
	 * @return <code>true</code> se l'operazione ha avuto successo,
	 *         <code>false</code> altrimenti.
	 * @throws ExistingDataException
	 */
	public boolean editProfile(long uid,String email,String nome,String cognome,String telefono,String indirizzo,
			String bio,String password,String newpassword) throws ExistingDataException;

	/**
	 * Aggiunge delle competenze a quelle dichiarate dall'utente.
	 * 
	 * @param uid
	 *            l'id dell'utente
	 * @param cid
	 *            un array contentente gli id delle competenze
	 * @return <code>true</code> se l'operazione ha avuto successo,
	 *         <code>false</code> altrimenti.
	 */
	public boolean addAbilities(long uid,long[] cid);

	public Map<String,String> getUserData(long userId);

	/**
	 * Ottiene l'id dell'utente con l'e-mail indicata
	 * 
	 * @param email
	 *            l'e-mail da cercare
	 * @return l'id dell'utente, o <code>-1</code> se non esiste un utente con
	 *         l'indirizzo associato
	 */
	public long getUserId(String email);

	/**
	 * Ottiene la lista di competenze, eventualmente vuota, dell'utente
	 * indicato.
	 * 
	 * @param uid
	 *            l'id dell'utente
	 * @return la lista di competenze, o <code>null</code> se l'utente non
	 *         esiste o non può avere una lista di competenza associata
	 */
	public Map<Long,String> getAbilities(long uid);

	/**
	 * Verifica che i dati forniti corrispondano ad un utente per effettuare il
	 * login.
	 * 
	 * @param email
	 *            email
	 * @param password
	 *            password
	 * @return l'id se l'utente esiste e i dati sono corretti, <code>-1</code>
	 *         altrimenti
	 */
	public long login(String email,String password);

	/**
	 * Verifica se l'utente con l'id indicato è un amministratore.
	 * 
	 * @param uid
	 *            l'id utente
	 * @return <code>true</code> se l'utente è un amministratore,
	 *         <code>false</code> altrimenti
	 */
	boolean isAdmin(long uid);

	/**
	 * Inserisce nel sistema un nuovo amministratore.
	 * 
	 * @param email
	 *            email
	 * @param password
	 *            password
	 * @return l'id dell'amministratore se l'operazione ha avuto successo,
	 *         <code>-1</code> altrimenti
	 * @throws ExistingDataException
	 */
	public long createAdmin(String email,String password) throws ExistingDataException;

	/**
	 * Cerca degli utenti che soddisfino le condizioni indicate nei parametri.
	 * Eventuali parametri nulli o vuoti sono ignorati.
	 * 
	 * @param nome
	 *            il nome dell'utente
	 * @param cognome
	 *            il cognome dell'utente
	 * @param indirizzo
	 *            parte dell'indirizzo dell'utente
	 * @param bio
	 *            parte delle informazioni extra dell'utente
	 * @param exclusive
	 *            <code>true</code> se la ricerca deve soddisfare tutte le
	 *            condizioni, <code>false</code> altrimenti
	 * @return la lista dei risultati, o <code>null</code> se non è stato
	 *         specificato alcun parametro
	 * @see UserData
	 */
	public List<UserData> search(String nome,String cognome,String indirizzo,String bio,boolean exclusive);

	/**
	 * Restituisce l'utente con l'id fornito.
	 * 
	 * @param uid
	 *            l'id dell'utente
	 * @return l'utente, o <code>null</code> se inesistente
	 */
	public User getUser(long uid);

	/**
	 * Restituisce l'account con l'id fornito.
	 * 
	 * @param uid
	 *            l'id dell'account
	 * @return l'account, o <code>null</code> se inesistente
	 */
	public Account getAccount(long id);

	/**
	 * Restituisce l'amministratore con l'id fornito.
	 * 
	 * @param uid
	 *            l'id dell'amministratore
	 * @return l'amministratore, o <code>null</code> se inesistente
	 */
	public Admin getAdmin(long aid);
}
